陌上花开,可缓缓归矣 ——吴越王
每日一学语文[滑稽]。
当然这题 $KDT$ 是可以做的,但是不费,所以用 $CDQ$ 算了吧。
很显然这道题是 $CDQ$ 三维偏序的板子题(luogu上它本来就是板子题)
$CDQ$ 分治的三维偏序怎么做?
对于其中的第一维,$CDQ$之前直接 $sort$ 排好序,那么这就可以保证对于一个 $i<j$ ,位置 $j$ 的元素一定是对位置 $i$ 的元素做不出贡献的,因为 $x_i <x_j$ 。
然后第二维,进入 $CDQ$ ,很显然当前的区间 $l - r$ 是会分成两个子区间分别做 $CDQ$ 的,那么当两个子区间合并的时候,左子区间是可能会对右子区间做出贡献的,但是右子区间对左子区间做不出任何贡献,原因是我们在之前已经按 $x$ 排好了序,那么显然左子区间的元素的 $x$ 始终小于右子区间的元素的 $x$。
外面排好了第一维,那么我们就在 $CDQ$ 中排第二维,由于我们是分成了两个子区间递归处理,往上面合并的时候,正好可以归并排序。第三位只需要在树状数组中记录一下,然后统计答案的时候调用树状数组的查询,看看比当前元素小的有多少个即可。
1 | void CDQ(int l,int r){ |
$QvQ$ 就这样了,只是这题需要离散化一下,$Code$ 中的 $size$ 就是元素出现的个数。
Code:
1 |
|
文章作者:Qiuly
发布时间:2019年02月22日 - 00:00
最后更新:2019年03月29日 - 13:52
原始链接:http://qiulyblog.github.io/2019/02/22/[题解]bzoj3262/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。